package com.weilx959.spt.app.context;

import com.weilx959.spt.core.interfaces.SPTPlugin;

import java.util.HashMap;
import java.util.Map;

/**
 * 插件上下文
 *
 * @author weilx
 * @since 2024-04-16
 */
public class PluginContext {
    private PluginContext() {}

    private static final ThreadLocal<Map<String, SPTPlugin>> PLUGIN_MAP_THREAD_LOCAL;

    static {
        PLUGIN_MAP_THREAD_LOCAL = new ThreadLocal<>();
        PLUGIN_MAP_THREAD_LOCAL.set(new HashMap<>());
    }

    /**
     * 获取插件
     *
     * @param id 插件名称
     * @return {@link SPTPlugin}
     */
    public static SPTPlugin get(String id) {
        return PLUGIN_MAP_THREAD_LOCAL.get().get(id);
    }

    /**
     * 获取全部插件
     *
     * @return {@link Map}<{@link String}, {@link SPTPlugin}>
     */
    public static Map<String, SPTPlugin> getAll() {
        return PLUGIN_MAP_THREAD_LOCAL.get();
    }

    /**
     * 设置插件
     *
     * @param id 插件名称
     * @param plugin     插件
     */
    public static void put(String id, SPTPlugin plugin) {
        PLUGIN_MAP_THREAD_LOCAL.get().put(id, plugin);
    }

    /**
     * 设置全部插件
     *
     * @param pluginMap 插件映射
     */
    public static void putAll(Map<String, SPTPlugin> pluginMap) {
        PLUGIN_MAP_THREAD_LOCAL.get().putAll(pluginMap);
    }

    /**
     * 设置插件映射
     *
     * @param pluginMap 插件映射
     */
    public static void set(Map<String, SPTPlugin> pluginMap) {
        PLUGIN_MAP_THREAD_LOCAL.set(pluginMap);
    }

    /**
     * 移除插件
     *
     * @param id 插件名称
     */
    public static void remove(String id) {
        PLUGIN_MAP_THREAD_LOCAL.get().remove(id);
    }

    /**
     * 清空插件映射
     */
    public static void clear() {
        PLUGIN_MAP_THREAD_LOCAL.get().clear();
    }

    /**
     * 摧毁
     */
    public static void destroy() {
        PLUGIN_MAP_THREAD_LOCAL.remove();
    }
}
